【PHP】parent - スーパークラスのメソッド呼び出し
スーパークラスを表すparentキーワードがあります。
parentキーワードを使うことで、サブクラスからスーパークラスのメソッドを呼び出すことが可能です。
ここでは、parentキーワードについて解説します。
検証環境
parent
parentキーワードは“スーパークラスを表すキーワード”です。
クラス内で使用し、スーパークラスのメソッド等にアクセスするために使用します。
また、オーバーライドしたメソッドでもparentキーワードを使うことで、スーパークラスのメソッドを呼び出すことが可能です。
基本構文
parent::メソッド名(実引数1, 実引数2 ...)
parent
キーワードに続いて、ダブルコロン(::
)を記述し、呼び出すメソッドを指定します。
サンプル
<?php
// 人間クラス
class Person {
public function greeting() {
echo "Hey!\n";
}
}
// 教師クラス
class Teacher extends Person {
public function greeting() {
___ih_hl_start
parent::greeting();
___ih_hl_end
echo "I'm a teacher.\n";
}
}
$teacher = new Teacher();
$teacher->greeting();
?>
$ php sample.php
Hey!
I'm a teacher.
16行目がparent
キーワードを使ったスーパークラスのメソッド呼び出しです。
実行結果から24行目のgreeting
の呼び出しで、スーパークラスであるPerson
クラスのgreeting
メソッドを初めに呼び出していることが分かります。
コンストラクタ
コンストラクタはメソッド名が決まっているため、定義するとスーパークラスのコンストラクタをオーバーライドします。
オーバーライドするとスーパークラスの初期化処理(コンストラクタの処理)が実行されません。
そのため、サブクラスでスーパークラス部分を初期化する必要がありますが、サブクラスのコンストラクタに同じようなコードを書くことになり、コードが複雑になります。
そこで、一般的にはparent
キーワードを使い、コンストラクタを呼び出して初期化処理を引き継ぐことが推奨されます。
<?php
// 人間クラス
class Person {
// 名前
public $name;
// コンストラクタ
public function __construct( $name ) {
$this->name = $name;
}
// あいさつ
public function greeting() {
echo "Hey!\n";
echo "My name is ". $this->name . ".\n";
}
}
// 教師クラス
class Teacher extends Person {
// 担当科目
public $subject;
// コンストラクタ
public function __construct( $name, $subject ) {
___ih_hl_start
parent::__construct($name);
___ih_hl_end
$this->subject = $subject;
}
// あいさつ
public function greeting() {
echo "Hello.\n";
echo "I'm a " . $this->name . ", a " . $this->subject . " instructor.\n";
}
}
$teacher = new Teacher('TANAKA', 'Programming');
$teacher->greeting();
?>
$ php sample.php
Hello.
I'm a TANAKA, a Programming instructor.
30行目がスーパークラスのコンストラクタの呼び出しです。
スーパークラス部分の初期化はスーパークラスのコンストラクタを使うことで、簡潔に初期化することができます。
アクセス修飾子の制限
アクセス修飾子がprivate
なプロパティ(フィールドやメソッド)はparent
キーワードでアクセスできません。
アクセス修飾子については別途解説しますが、ここでは、public
またはprotected
なプロパティのみparent
キーワードでアクセスできることを覚えておきましょう。
演習問題
次の実行結果になる会計プログラムを作成してください。
なお、下記条件を満たすものとします。
- 小計クラス(Subtotal)を作成する
- 小計クラスは複数料金を記憶する$pricesフィールド(配列)を持つ
- 小計クラスは小計金額を計算するcalcメソッドを持つ(小計金額は$pricesに記憶された値の合計値)
- 会計クラス(Bill)を作成する
- 会計クラスは小計クラスを継承する
- 会計クラスはcalcメソッドをオーバーライドし、小計に消費税を加算した値を計算する。
※ 消費税率は10%とします。 - 会計クラスのcalcメソッドは小計クラスのcalcメソッドを使う
- 料金は標準入力で与える(空文字を入力するまで)
$ php practice.php
1000
2300
3500
合計金額 : 7480円
次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。
- 下記表の3つのクラスを作成する
- 実行結果になるように各クラスのインスタンスを使う
クラス | 英記 | 継承元 | フィールド | メソッド |
---|---|---|---|---|
チケットクラス | Ticket |
なし | ・$price (料金) |
・info()
→ $ の値を出力 |
ライブチケット | LiveTicket |
Ticket |
・$place (場所) |
・info()
→ 場所と料金を出力 ※ スーパークラスのinfoメソッドを利用する |
ライブ配信チケット | LiveStreamingTicket |
Ticket |
・$url (URL) |
・info()
→ URLと料金を出力 ※ スーパークラスのinfoメソッドを利用する |
===== チケット =====
料金 : 5000円
===== ライブチケット =====
料金 : 8000円
場所 : ライブハウス
===== ライブ配信 =====
料金 : 3000円
URL : https://it-hack.net/live-streaming